package fiuba.algo3.algoThieft.modelo;


import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class Mapa implements Deserializable {

	private HashMap<String,Capital> capitales;
	
	public Mapa() throws SAXException, IOException, ParserConfigurationException{
        //se crea cargando las capitales del archivo ciudades2.xml
        capitales = new HashMap <String,Capital>();
        Persistor persistor = new Persistor();
        persistor.deserializarDesdeElArchivo(this , "ciudades.xml" );
	
	}
	
	private void establecerRelacionesEntreCapitales(List<Capital> capitales) {
        Capital primerCapital = capitales.get( 0 );
        Capital ultimaCapital = capitales.get( capitales.size() - 1 );
        primerCapital.setCapitalesAdyacentes( ultimaCapital , capitales.get(1) , capitales.get(capitales.size() / 2 ) );
        ultimaCapital.setCapitalesAdyacentes( capitales.get( capitales.size() - 2 ) , primerCapital  , capitales.get( (capitales.size() / 2) - 1) );
        for ( int i=1 ; i < ( (capitales.size() / 2 ) ) ; i++ ){
                Capital unaCapital = capitales.get( i );
                Capital otraCapital = capitales.get( capitales.size() - 1 - i );
                unaCapital.setCapitalesAdyacentes( capitales.get( i - 1 ) , capitales.get( i + 1 ) , capitales.get( ( capitales.size()/2) + i ) );
                otraCapital.setCapitalesAdyacentes( capitales.get( capitales.size() - 2 - i ) , capitales.get( capitales.size() - i ) , capitales.get( ( capitales.size()/2) - 1 - i ) );
        }
        
	}
	
	public Collection<Capital> getCapitales() {
	        
        return this.capitales.values();
	}
	
	
	@Override
	public void deserializar(Document doc) {
        Element elementoMapa = (Element) doc.getElementsByTagName("Capitales").item( 0 );
        List<Capital> capitales = new ArrayList<Capital>();
        for ( int i=0 ; i < elementoMapa.getChildNodes().getLength() ; i++ ){
                capitales.add( Capital.crearCapital ( elementoMapa.getChildNodes().item( i ) ) );
        }
        this.establecerRelacionesEntreCapitales(capitales);
        for (Capital capital : capitales) {
                   this.capitales.put(capital.getNombre(), capital);
                }   
	}
	
	public Capital getCapital(String nombreCapital) {
        Capital capital = this.capitales.get(nombreCapital);
        return capital;
	}

	public void setPistasLadronDesconocido(List<Capital> rutaDelLadron) {
		ArrayList<Capital> capitales = new ArrayList<Capital>(this.getCapitales());
		for (Capital capital : capitales){
			if (!rutaDelLadron.contains(capital)){
				capital.desconocerLadron();
			}
		}
	}

}